package blog

import (
	"context"
	"strconv"
	"vblog/logger"
)

const (
	// App指的是一个业务单元
	// ioc.GetController(AppName) 获取到这个业务模块的具体实现
	AppName = "blogs"
)

//博客管理业务接口,规范文章管理模块都有那些服务(service)接口

type Service interface {
	//一定要保证很强的兼容性
	QueryBlog(context.Context, *QueryBlogRequest) (*BlogSet, error)
	DescribeBlog(context.Context, *DescribeBlogRequest) (*Blog, error)
	CreateBlog(context.Context, *CreateBlogRequest) (*Blog, error)
	UpdateBlog(context.Context, *UpdateBlogRequest) (*Blog, error)
	DeleteBlog(context.Context, *DeleteBlogRequest) (*Blog, error)
}

func NewQueryBlogRequest() *QueryBlogRequest {
	return &QueryBlogRequest{
		PageSize:   20,
		PageNumber: 1,
	}
}

// 1. 列表查询请求的参数
// 服务端分页,默认:1页 20个
// 关键字查询, 模糊搜索
// 条件过滤,比如过滤作者是谁的文章
type QueryBlogRequest struct {
	// 一页多少个数据
	PageSize int `json:"page_size"`
	// 当前是第几页
	PageNumber int `json:"page_number"`
	// 模糊搜索文章内容,关键字
	Keywords string `json:"keywords"`
	// 作者名字
	Author string `json:"author"`
}

func (r *QueryBlogRequest) Offset() int {
	// 计算当前页前面有多少个数据,供sql查询时offset使用
	logger.L().Debug().Msg(strconv.Itoa(r.PageNumber))
	return (r.PageNumber - 1) * r.PageSize
}

func NewDescribeRequest(id string) *DescribeBlogRequest {
	return &DescribeBlogRequest{
		Id: id,
	}
}

type DescribeBlogRequest struct {
	Id string
}

func NewUpdateBlogRequest(id string) *UpdateBlogRequest {
	return &UpdateBlogRequest{
		DescribeBlogRequest: NewDescribeRequest(id),
		CreateBlogRequest:   NewCreateBlogRequest(),
	}
}

type UpdateBlogRequest struct {
	*DescribeBlogRequest
	*CreateBlogRequest
}

func NewDeleteBlogRequest(id string) *DeleteBlogRequest {
	return &DeleteBlogRequest{
		DescribeBlogRequest: NewDescribeRequest(id),
	}
}

type DeleteBlogRequest struct {
	*DescribeBlogRequest
}
